# Create your models here.
from time import timezone

from django.db import models

# Create your models here.

"""
先写普通字段
之后再写外键字段
"""

from django.contrib.auth.models import AbstractUser  # 导入auth


# 登录web用户
class UserInfo(AbstractUser):
    phone = models.BigIntegerField(verbose_name='手机号', null=True, blank=True)  # 允许为空
    """
    null=True : 数据库允许值为空
    blank=True ： admin后台管理允许值为空
    """
    # 头像
    avatar = models.FileField(upload_to='avatar/', default='avatar/default.png', verbose_name='用户头像')  # 头像的存放，有一个默认的头像，
    """
    给avatar 字段传文件对象，该文件会自动存储到avatar文件下，然后avatar字段只保存文件路径 avatar/default.png
    """

    create_time = models.DateField(auto_now_add=True)

    class Meta:
        verbose_name_plural = '用户表'  # 修改admin后台管理默认的表名
        # verbose_name = '用户表'  # 末尾还是会自动加s

    def __str__(self):  # str方法    显示对象的名称，在admin上，便于查看
        return self.username


# 定时任务  存pid
class DSRWpid(models.Model):
    # 这个表中值存放任务的pid 便于 后期 任务关闭
    process_id = models.BigIntegerField(verbose_name='任务线程')
    dsrw_name = models.CharField(verbose_name='定时任务名称', max_length=120, default='name')

# 定时任务 log
class DSRW(models.Model):
    queue_name = models.CharField(verbose_name='定时任务名称', max_length=120)
    process_id = models.BigIntegerField(verbose_name='任务线程')
    isnot_success = models.CharField(verbose_name='是否执行', max_length=64)
    publish_time_format = models.CharField(verbose_name="执行时间", max_length=120)


# 存 定时任务 机器执行 结果
class DSRWresult(models.Model):
    queue_name = models.CharField(verbose_name='定时任务名称', max_length=120)
    process_id = models.BigIntegerField(verbose_name='任务线程')
    publish_time_format = models.CharField(verbose_name="执行时间", max_length=120)
    dsrw_result = models.TextField(verbose_name="定时任务机器执行结果")


# 存 定时任务  工作和放假日期
class DSRWswitch(models.Model):
    switch_name = models.CharField(verbose_name='任务开关名称', max_length=120)
    switch_start_time = models.CharField(verbose_name='任务开始时间', max_length=120)
    switch_end_time = models.CharField(verbose_name="任务结束时间", max_length=120)
    id_active_id = models.CharField(verbose_name="存前端选择的任务id", max_length=64)


# 机器 不参加 渲染的 同事名
class DSRWnoxrname(models.Model):
    colleague_name = models.TextField(verbose_name="机器不参加渲染的同事名")
    # 'liusz','chendd','fanglf','liuying3','lijq','shiss','chenkai','ronghy','tho','ronghy','zhouzl','xieql','lily','jianan'


###  webssh

# 远程连接的用户
class RemoteUser(models.Model):
    """
    名称唯一，用户名可以重复，不同主机登陆用户名相同，密码不同
    """

    name = models.CharField(max_length=128, verbose_name="名称", primary_key=True)
    username = models.CharField(max_length=128, verbose_name="用户名")
    password = models.TextField(verbose_name="密码")  # 加密后 字符太多
    create_time = models.DateTimeField('添加时间', auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ["-create_time"]  # 默认排序 - 为倒叙
        verbose_name = "主机账户"
        verbose_name_plural = "主机账户"


# 远程主机
class RemoteHost(models.Model):
    PROTOCOL_CHOICES = (  # 目前支持ssh, telnet
        (1, 'ssh'),
        (2, 'telnet'),
    )

    hostname = models.CharField(max_length=128, unique=True, verbose_name='主机名')
    ip = models.GenericIPAddressField(verbose_name='主机IP')  # 做了ip映射，ip可能重复，ip:port 不会重复
    protocol = models.SmallIntegerField(default=1, choices=PROTOCOL_CHOICES, verbose_name='协议')
    port = models.SmallIntegerField(default=22, verbose_name='端口')
    # on_delete 当 RemoteUser 记录被删时，阻止其操作
    remote_user = models.ForeignKey('RemoteUser', blank=True, null=True, on_delete=models.PROTECT)
    #  我测试了给 remote_user  自定义外键名称 db_column='remote_user'  发现在前端 失败了

    create_time = models.DateTimeField('添加时间', auto_now_add=True)

    def __str__(self):
        return self.hostname

    class Meta:
        ordering = ["-create_time"]
        verbose_name = '远程主机'
        verbose_name_plural = '远程主机'
        unique_together = ('ip', 'protocol', 'port', 'remote_user')
        # 一个用户下，只能绑定同一个主机一次，不能一个用户下绑定两个相同主机


# webssh 操作 日志
class TerminalLog(models.Model):
    hostname = models.CharField(max_length=128, verbose_name='主机名')
    ip = models.GenericIPAddressField(verbose_name='主机IP')
    protocol = models.CharField(max_length=64, default='ssh', verbose_name="协议")
    port = models.SmallIntegerField(default=22, verbose_name='端口')
    username = models.CharField(max_length=128, verbose_name="用户名")
    cmd = models.TextField('命令详情', blank=True, null=True)
    detail = models.TextField(blank=True, null=True, verbose_name="结果详情")
    address = models.GenericIPAddressField('IP地址', blank=True, null=True)
    start_time = models.DateTimeField('会话开始时间')
    create_time = models.DateTimeField('事件时间', auto_now_add=True)
    video_lx = models.ForeignKey('LuXiangVideo', blank=True, null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.hostname

    class Meta:
        ordering = ["-create_time"]  # 默认的排序字段、- 为倒叙
        verbose_name = '在线会话日志'
        verbose_name_plural = '在线会话日志'


# 录像 生成的时间和 存放路径
class LuXiangVideo(models.Model):
    start_time = models.CharField(max_length=256, verbose_name="会话开始时间", primary_key=True)

    video_lx = models.TextField(verbose_name="webssh录像地址")


## 图标数据 1
class tubiao1(models.Model):
    riqi = models.CharField(max_length=128, verbose_name='日期')
    data_day = models.CharField(max_length=128, verbose_name='每天的数据')


##  存每天 渲染的机器数、不参加渲染的机器数、没有用户的 机器数
class xrtb(models.Model):
    riqi = models.CharField(max_length=256, verbose_name='日期')
    xr_w_num_z01 = models.CharField(max_length=128, blank=True, null=True, verbose_name='参加渲染的机器_早上第一次',default='0')
    xr_w_num_z02 = models.CharField(max_length=128, blank=True, null=True, verbose_name='参加渲染的机器_早上第二次',default='0')
    no_x_num_z01 = models.CharField(max_length=128, blank=True, null=True, verbose_name='不参加渲染同事机器_早上第一次',default='0')
    no_x_num_z02 = models.CharField(max_length=128, blank=True, null=True, verbose_name='不参加渲染同事机器_早上第二次',default='0')
    no_o_num_z01 = models.CharField(max_length=128, blank=True, null=True, verbose_name='没有用户的机器_早上第一次',default='0')
    no_o_num_z02 = models.CharField(max_length=128, blank=True, null=True, verbose_name='没有用户的机器_早上第二次',default='0')
    xr_w_num_w01 = models.CharField(max_length=128, blank=True, null=True, verbose_name='参加渲染的机器_晚上第一次',default='0')
    xr_w_num_w02 = models.CharField(max_length=128, blank=True, null=True, verbose_name='参加渲染的机器_晚上第二次',default='0')
    no_x_num_w01 = models.CharField(max_length=128, blank=True, null=True, verbose_name='不参加渲染同事机器_晚上第一次',default='0')
    no_x_num_w02 = models.CharField(max_length=128, blank=True, null=True, verbose_name='不参加渲染同事机器_晚上第二次',default='0')
    no_o_num_w01 = models.CharField(max_length=128, blank=True, null=True, verbose_name='没有用户的机器_晚上第一次',default='0')
    no_o_num_w02 = models.CharField(max_length=128, blank=True, null=True, verbose_name='没有用户的机器_晚上第二次',default='0')

    class Meta:
        ordering = ["-riqi"]  # 默认的排序字段、- 为倒叙




#  rsync  所有的 任务信息
class allrsyncdate(models.Model):

    source_ip = models.CharField(max_length=128, verbose_name="源ip")
    source_path = models.CharField(max_length=255, verbose_name="源地址")
    destination_ip = models.CharField(max_length=128, verbose_name="目的ip")
    destination_path = models.CharField(max_length=255, verbose_name="目的地址")
    create_time = models.DateTimeField('添加时间', auto_now_add=True)
    rsync_result_value = models.CharField(max_length=128, verbose_name="命令执行后返回的结果值",default=2)
    rsync_result_sc = models.TextField( verbose_name="命令运行后的输出",default='没执行')